# @backstage/plugin-signals-node

Welcome to the Node.js library package for the signals plugin!

Signals plugin allows backend plugins to publish messages to frontend plugins.

## Getting started

Add SignalService to your plugin environment in `packages/backend/src/types.ts`:

```ts
import { SignalService } from '@backstage/plugin-signals-node';

export type PluginEnvironment = {
  // ...
  signalService: SignalService;
};
```

Add it also to your `makeCreateEnv` to allow access from the other plugins:

```ts
import { SignalService } from '@backstage/plugin-signals-node';
import { DefaultEventBroker } from '@backstage/plugin-events-backend';

function makeCreateEnv(config: Config) {
  // ...

  const eventBroker = new DefaultEventBroker(root.child({ type: 'plugin' }));
  const signalService = DefaultSignalService.create({
    eventBroker,
  });

  return (plugin: string): PluginEnvironment => {
    const logger = root.child({ type: 'plugin', plugin });
    return {
      logger,
      eventBroker,
      signalService,
      // ...
    };
  };
}
```

To allow connections from the frontend, you should also install the `@backstage/plugin-signals-backend`.

## Using the service

Once you have both of the backend plugins installed, you can utilize the signal service by calling the
`publish` method. This will publish the message to all subscribers in the frontend. To send message to
all subscribers, you can use `null` as `recipients` parameter.

```ts
// Periodic sending example
setInterval(async () => {
  await signalService.publish({
    recipients: null,
    channel: 'my_plugin',
    message: {
      message: 'hello world',
    },
  });
}, 5000);
```

To receive this message in the frontend, check the documentation of `@backstage/plugin-signals` and
`@backstage/plugin-signals-react`.

## Using event broker directly

Other way to send signals is to utilize the `EventBroker` directly. This requires that the payload is correct for it
to work:

```ts
eventBroker.publish({
  topic: 'signals',
  eventPayload: {
    recipients: ['user:default/user1'],
    message: {
      message: 'hello world',
    },
    channel: 'my_plugin',
  },
});
```
